package com.zhengbing.tj.common;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * Redis工具类
 * 基于Spring Data Redis封装常用Redis操作，提供字符串类型的键值对存储、过期时间设置等功能
 * 用于缓存管理、会话存储、分布式锁等需要高性能缓存支持的业务场景
 * 
 * @author zhengbing
 * @date 2025-07-07
 */
@Component
public class RedisUtil {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    /**
     * 设置key-value，带过期时间
     * 支持指定过期时间和时间单位，实现键值对的自动过期清理
     * 
     * @param key 缓存键
     * @param value 缓存值
     * @param timeout 过期时间数值
     * @param unit 时间单位（如TimeUnit.SECONDS、TimeUnit.MINUTES等）
     */
    public void set(String key, String value, long timeout, TimeUnit unit) {
        stringRedisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    /**
     * 获取key对应的value
     * 根据键获取对应的字符串值，如果键不存在则返回null
     * 
     * @param key 缓存键
     * @return 对应的缓存值，如果键不存在返回null
     */
    public String get(String key) {
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        return ops.get(key);
    }

    /**
     * 删除key
     * 从Redis中删除指定的键及其对应的值
     * 
     * @param key 要删除的缓存键
     */
    public void delete(String key) {
        stringRedisTemplate.delete(key);
    }

    /**
     * 设置key过期时间
     * 为已存在的键设置新的过期时间，实现缓存数据的延时失效
     * 
     * @param key 缓存键
     * @param timeout 过期时间数值
     * @param unit 时间单位
     * @return 设置成功返回true，如果键不存在返回false
     */
    public boolean expire(String key, long timeout, TimeUnit unit) {
        return Boolean.TRUE.equals(stringRedisTemplate.expire(key, timeout, unit));
    }
}